{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "=============================================================\n",
    "Receiver Operating Characteristic (ROC) with cross validation\n",
    "=============================================================\n",
    "\n",
    "Example of Receiver Operating Characteristic (ROC) metric to evaluate\n",
    "classifier output quality using cross-validation.\n",
    "\n",
    "ROC curves typically feature true positive rate on the Y axis, and false\n",
    "positive rate on the X axis. This means that the top left corner of the plot is\n",
    "the \"ideal\" point - a false positive rate of zero, and a true positive rate of\n",
    "one. This is not very realistic, but it does mean that a larger area under the\n",
    "curve (AUC) is usually better.\n",
    "\n",
    "The \"steepness\" of ROC curves is also important, since it is ideal to maximize\n",
    "the true positive rate while minimizing the false positive rate.\n",
    "\n",
    "This example shows the ROC response of different datasets, created from K-fold\n",
    "cross-validation. Taking all of these curves, it is possible to calculate the\n",
    "mean area under curve, and see the variance of the curve when the\n",
    "training set is split into different subsets. This roughly shows how the\n",
    "classifier output is affected by changes in the training data, and how\n",
    "different the splits generated by K-fold cross-validation are from one another.\n",
    "\n",
    "<div class=\"alert alert-info\"><h4>Note</h4><p>See also :func:`sklearn.metrics.roc_auc_score`,\n",
    "             :func:`sklearn.model_selection.cross_val_score`,\n",
    "             `sphx_glr_auto_examples_model_selection_plot_roc.py`,</p></div>\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy import interp\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn import svm, datasets\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "from sklearn.model_selection import StratifiedKFold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# #############################################################################\n",
    "# Data IO and generation\n",
    "\n",
    "# Import some data to play with\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "X, y = X[y != 2], y[y != 2]\n",
    "n_samples, n_features = X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Add noisy features\n",
    "random_state = np.random.RandomState(0)\n",
    "X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# #############################################################################\n",
    "# Classification and ROC analysis\n",
    "\n",
    "# Run classifier with cross-validation and plot ROC curves\n",
    "cv = StratifiedKFold(n_splits=6)\n",
    "classifier = svm.SVC(kernel='linear', probability=True,\n",
    "                     random_state=random_state)\n",
    "\n",
    "tprs = []\n",
    "aucs = []\n",
    "mean_fpr = np.linspace(0, 1, 100)\n",
    "\n",
    "i = 0\n",
    "for train, test in cv.split(X, y):\n",
    "    probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])\n",
    "    # Compute ROC curve and area the curve\n",
    "    fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])\n",
    "    tprs.append(interp(mean_fpr, fpr, tpr))\n",
    "    tprs[-1][0] = 0.0\n",
    "    roc_auc = auc(fpr, tpr)\n",
    "    aucs.append(roc_auc)\n",
    "    plt.plot(fpr, tpr, lw=1, alpha=0.3,\n",
    "             label='ROC fold %d (AUC = %0.2f)' % (i, roc_auc))\n",
    "\n",
    "    i += 1\n",
    "plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
    "         label='Chance', alpha=.8)\n",
    "\n",
    "mean_tpr = np.mean(tprs, axis=0)\n",
    "mean_tpr[-1] = 1.0\n",
    "mean_auc = auc(mean_fpr, mean_tpr)\n",
    "std_auc = np.std(aucs)\n",
    "plt.plot(mean_fpr, mean_tpr, color='b',\n",
    "         label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
    "         lw=2, alpha=.8)\n",
    "\n",
    "std_tpr = np.std(tprs, axis=0)\n",
    "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
    "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
    "plt.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
    "                 label=r'$\\pm$ 1 std. dev.')\n",
    "\n",
    "plt.xlim([-0.05, 1.05])\n",
    "plt.ylim([-0.05, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic example')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
